#ifndef GERADORCODIGO_H_
#define GERADORCODIGO_H_

#include "NoArvore.h"
#include "NoHash.h"
#include "HashIdentificadores.h"
#include "Arquivo.h"
#include <sstream>
#include <iostream>
#include <vector>
#include <stack>

using namespace std;

struct label
{
	int linha;
	string funcao;
};

class GeradorCodigo
{
public:
	GeradorCodigo(NoArvore &, HashIdentificadores &, string);
	virtual ~GeradorCodigo();
private:
	void CarregarConstante(string);
	void CarregaValor(int, int);
	void Soma();
	void Subtracao();
	void Multiplicacao();
	void Divisao();
	void InverteSinal();
	void Conjuncao();//comando AND
	void Disjuncao();//comando OR
	void Negacao();
	void ComparaMenor();
	void ComparaMaior();
	void ComparaIgual();
	void ComparaDesigual();
	void ComparaMenorIgual();
	void ComparaMaiorIgual();
	void ArmazenaValor(int, int);
	void DesviarSempre(int);
	string RetDesviarSempre(int);
	void DesviarSeFalso(int);
	string RetDesviarSeFalso(int);
	void Nada();
	void Leitura();
	void Imprimir();
	void ImprimirPularLinha();
	void ImprimirCaractere();
	void IniciaProgramaPrincipal();
	void AlocarMemoria(int);
	void Para();
	void ChamarProcedimento(int);
	void EntrarProcedimento(int);
	void RetornarProcedimento(int);
	void DesalocarMemoria(int);
	void CarregaValorIndireto(int, int);
	void ArmazenaValorIndireto(int, int);
	void CarregaEndereco(int, int);
	void Tradutor(vector<NoArvore *>);
	void ImprimeLinha(string);
	void ImprimeArquivo();
	void SetaAvaliado(vector<NoArvore *>);
	//renan
	void DeclaraProcedimento(vector<NoArvore *>);
	int RetLabel(string );
	
	NoArvore * mArvoreSintatica;
	HashIdentificadores * mHash;
	Arquivo mArquivoMepa;
	string mSaidaMepa;
	int mLinhaAtual;
	int mUltimoDesvio;
	stack<int> mDesvios;
	int mDeslocamento;
	int mMemoriaAlocada;
	vector<string> mLinhaMepa;
	vector<label> mLabel; // label para chamar funcao
};

#endif /*GERADORCODIGO_H_*/
